package org.jeecg.modules.online.desform.util.convert;


import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.jeecg.common.util.DateUtils;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 表单设计器数据类型转换器，一般用于导入
 */
@Slf4j
public class DesformConverter {

    // yyyy-MM-dd
    private static SimpleDateFormat date_case_1;
    // yyyy-M-d
    private static SimpleDateFormat date_case_2;
    // yyyy-MM-d
    private static SimpleDateFormat date_case_3;
    // yyyy-M-dd
    private static SimpleDateFormat date_case_4;

    // HH:mm:ss
    private static SimpleDateFormat time_case_1;
    // H:mm:ss
    private static SimpleDateFormat time_case_2;
    // H:m:ss
    private static SimpleDateFormat time_case_3;
    // H:m:s
    private static SimpleDateFormat time_case_4;
    // H:mm:s
    private static SimpleDateFormat time_case_5;
    // HH:m:ss
    private static SimpleDateFormat time_case_6;


    public static void initialCase() {
        if (date_case_1 == null) {
            date_case_1 = DateUtils.date_sdf.get();
        }
        if (date_case_2 == null) {
            date_case_2 = new SimpleDateFormat("yyyy-M-d");
        }
        if (date_case_3 == null) {
            date_case_3 = new SimpleDateFormat("yyyy-MM-d");
        }
        if (date_case_4 == null) {
            date_case_4 = new SimpleDateFormat("yyyy-M-dd");
        }

        if (time_case_1 == null) {
            time_case_1 = new SimpleDateFormat("HH:mm:ss");
        }
        if (time_case_2 == null) {
            time_case_2 = new SimpleDateFormat("H:mm:ss");
        }
        if (time_case_3 == null) {
            time_case_3 = new SimpleDateFormat("H:m:ss");
        }
        if (time_case_4 == null) {
            time_case_4 = new SimpleDateFormat("H:m:s");
        }
        if (time_case_5 == null) {
            time_case_5 = new SimpleDateFormat("H:mm:s");
        }
        if (time_case_6 == null) {
            time_case_6 = new SimpleDateFormat("HH:m:ss");
        }
    }

    private static Date parseOneCaseDate(SimpleDateFormat sdf, String value) {
        try {
            return sdf.parse(value);
        } catch (Exception e) {
            return null;
        }
    }

    private static Date parseAllCaseDate(SimpleDateFormat[] sdfArray, String value) {
        for (SimpleDateFormat sdf : sdfArray) {
            Date parseDate = DesformConverter.parseOneCaseDate(sdf, value);
            if (parseDate != null) {
                return parseDate;
            }
        }
        return null;
    }

    /**
     * 用于格式化日期
     *
     * @return
     */
    public static String formatDate(ConvertItem item) {
        log.debug("进入 DesformConverter.formatDate 方法");

        String value = item.getValue();
        log.debug("---原始值：" + value);

        if (StringUtils.isNotBlank(value)) {
            DesformConverter.initialCase();

            // 将字符串转换为日期
            SimpleDateFormat[] sdfArray = {date_case_1, date_case_2, date_case_3, date_case_4};
            Date parseDate = DesformConverter.parseAllCaseDate(sdfArray, value);

            // 全部转换失败，返回原始值
            if (parseDate == null) {
                return value;
            }
            // 按照设计器的格式化方式再格式化一遍
            JSONObject element = item.getElement();
            JSONObject options = element.getJSONObject("options");
            String format = options.getString("format");

            String convertedValue;
            try {
                SimpleDateFormat sdf = new SimpleDateFormat(format);
                convertedValue = sdf.format(parseDate);
            } catch (Exception e) {
                convertedValue = date_case_1.format(value);
            }
            log.debug("---转换后的值：" + convertedValue);
            log.debug("结束 DesformConverter.formatDate 方法");
            return convertedValue;
        }
        log.debug("结束 DesformConverter.formatDate 方法");
        return value;

    }

    /**
     * 用于格式化日期
     *
     * @return
     */
    public static String formatTime(ConvertItem item) {
        String value = item.getValue();
        if (StringUtils.isNotBlank(value)) {
            DesformConverter.initialCase();
            // 将字符串转换为日期
            SimpleDateFormat[] sdfArray = {time_case_1, time_case_2, time_case_3, time_case_4, time_case_5, time_case_6};
            Date parseDate = DesformConverter.parseAllCaseDate(sdfArray, value);
            // 全部转换失败，返回原始值
            if (parseDate == null) {
                return value;
            }
            // 按照设计器的格式化方式再格式化一遍
            JSONObject element = item.getElement();
            JSONObject options = element.getJSONObject("options");
            String format = options.getString("format");
            String convertedValue;
            try {
                SimpleDateFormat sdf = new SimpleDateFormat(format);
                convertedValue = sdf.format(parseDate);
            } catch (Exception e) {
                convertedValue = time_case_1.format(value);
            }
            return convertedValue;
        }
        return value;
    }

    /**
     * 用于格式化数字【控件：计数器】
     *
     * @return
     */
    public static int formatNumber(ConvertItem item) {
        String value = item.getValue();
        try {
            return Integer.parseInt(value);
        } catch (NumberFormatException nfe) {
            return 0;
        }
    }

}
